package com;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import org.apache.commons.lang3.StringUtils;

public class TestAutoGenerate {

  public static Properties properties = new Properties();

  static {
    // 使用ClassLoader加载properties配置文件生成对应的输入流
    InputStream in =
        TestAutoGenerate.class.getClassLoader().getResourceAsStream("generator.properties");
    // 使用properties对象加载输入流
    try {
      properties.load(in);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  public static void main(String[] args) {

    // Step1：代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // Step2：全局配置
    GlobalConfig gc = new GlobalConfig();
    // 填写代码生成的目录(需要修改)
    String basePath =
        new File(TestAutoGenerate.class.getResource("/").getFile())
            .getParentFile()
            .getParentFile()
            .getParentFile()
            .getParentFile()
            .toPath()
            .toString();
    // 拼接出代码最终输出的目录
    gc.setOutputDir(basePath + "/src/main/java");
    // 配置开发者信息（可选）（需要修改）
    gc.setAuthor("奇生");
    // 配置是否打开目录，false 为不打开（可选）
    gc.setOpen(false);
    //     实体属性 Swagger2 注解，添加 Swagger 依赖，开启 Swagger2 模式（可选）
    gc.setSwagger2(true);
    // 重新生成文件时是否覆盖，false 表示不覆盖（可选）
    gc.setFileOverride(true);
    // 配置主键生成策略，此处为 ASSIGN_ID（可选）
    gc.setIdType(IdType.AUTO);
    // 配置日期类型，此处为 ONLY_DATE（可选）
    gc.setDateType(DateType.ONLY_DATE);
    // 默认生成的 service 会有 I 前缀
    gc.setServiceName("%sService");
    gc.setBaseResultMap(true);
    gc.setBaseColumnList(true);
    gc.setActiveRecord(false);
    gc.setEnableDS(Boolean.parseBoolean(properties.getProperty("enableDS")));
    gc.setDsDoc(properties.getProperty("dsDoc").replaceAll("_","-"));
    mpg.setGlobalConfig(gc);

    // Step3：数据源配置（需要修改）
    DataSourceConfig dsc = new DataSourceConfig();
    // 配置数据库 url 地址
    dsc.setUrl(properties.getProperty("jdbc.connectionURL"));
    //     dsc.setSchemaName("supplier_group"); // 可以直接在 url 中指定数据库名
    // 配置数据库驱动
    dsc.setDriverName(properties.getProperty("jdbc.driverClass"));
    // 配置数据库连接用户名
    dsc.setUsername(properties.getProperty("jdbc.userId"));
    // 配置数据库连接密码
    dsc.setPassword(properties.getProperty("jdbc.password"));
    mpg.setDataSource(dsc);

    // Step:4：包配置
    PackageConfig pc = new PackageConfig();
    // 配置父包名（需要修改）
    pc.setParent(properties.getProperty("parent"));
    // 配置模块名（需要修改）
    pc.setModuleName(properties.getProperty("moduleName"));
    // 配置 entity 包名
    pc.setEntity(properties.getProperty("entity"));
    // 配置 mapper 包名
    pc.setMapper(properties.getProperty("mapper"));
    // 配置 service 包名
    pc.setService(properties.getProperty("service"));
    // 配置 service 实现类包名
    pc.setServiceImpl(properties.getProperty("serviceImpl"));
    // 配置 controller 包名
    pc.setController(properties.getProperty("controller"));
    pc.setXml(properties.getProperty("xml"));
    mpg.setPackageInfo(pc);

    // Step5：策略配置（数据库表配置）
    StrategyConfig strategy = new StrategyConfig();
    // 指定表名（可以同时操作多个表，使用 , 隔开）（需要修改）
    if (StringUtils.isBlank(properties.getProperty("tableNames"))) {
      strategy.setExclude("");
    } else {
      strategy.setInclude(properties.getProperty("tableNames").split(","));
    }
    // 配置数据表与实体类名之间映射的策略
    strategy.setNaming(NamingStrategy.underline_to_camel);
    // 配置数据表的字段与实体类的属性名之间映射的策略
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    // 配置 lombok 模式
    strategy.setEntityLombokModel(true);
    // 配置 rest 风格的控制器（@RestController）
    strategy.setRestControllerStyle(true);
    // 配置驼峰转连字符
    strategy.setControllerMappingHyphenStyle(true);
    // 构建者模式，使用 lombok 的时候就没用了
    // public User setName(String name) { this.name = name; return this; }
    //    strategy.setEntityBuilderModel(true);
    // 为字段生成 @TableField 注解
//    strategy.setEntityTableFieldAnnotationEnable(false);
    strategy.setEntityTableFieldAnnotationEnable(false);
    strategy.setLogicDeleteFieldName(properties.getProperty("enabledFlag"));
    // 配置表前缀，生成实体时去除表前缀
    // 此处的表名为 test_mybatis_plus_user，模块名为 test_mybatis_plus，去除前缀后剩下为 user。
    strategy.setTablePrefix(pc.getModuleName() + "_");
    mpg.setStrategy(strategy);

    // Step6：执行代码生成操作
    mpg.execute();
  }
}
